//如果是数组类型就返回数组类型，否则传入什么类型就返回什么类型
type Infer<T> = T extends Array<any> ? T[number] : T
type A = Infer<(string | boolean)[]>
type B = Infer<null>

//使用infer修改
type Infer<T> = T extends Array<infer U> ? U : T
type A = Infer<(string | Symbol)[]>

// 配合tuple 转换 union 联合类型
type TupleToUni<T> = T extends Array<infer E> ? E : never
type TTuple = [string, number];
type ToUnion = TupleToUni<TTuple>; // string | number